
import java.util.ArrayList;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.util.List;

/**
 *
 * @author yuri
 */
public class QuebraCabeca {

    private int dimensao;
    private int[][] objetivo;
    private int[][] estado;
    
    public QuebraCabeca(int tamanho) {
        dimensao = tamanho;
        objetivo = inicializaObjetivo();
        preencheMisturaPecas();
        imprimePecasMisturadas(estado);
    }

    public QuebraCabeca(int[][] estado, int[][] objetivo) {
        this.estado = estado;
        this.objetivo = objetivo;
    }

    public void imprimePecasMisturadas(int[][] estado){
        String saida = "";
        for (int i = 0; i < estado.length; i++) {
            saida += "\n";
            for (int j = 0; j < estado.length; j++) {
                saida += "\t[x:"+i+",y:"+j+"] " + estado[i][j];
            }            
        }
        System.out.println(saida);
    }
    
    /**
     * metodo que varre todo o array ambiente sorteando as posicoes dos numero do quebra-cabecas
     * @return o array ambiente com as pecas ja misturadas
     */
    private void preencheMisturaPecas() {
        List<Integer> numerosSorteados = new ArrayList();
        estado = new int[dimensao][dimensao];
        for (int i = 0; i < estado.length; i++) {
            for (int j = 0; j < estado.length; j++) {
                int valorSorteado = (int) (Math.random() * (Math.pow(dimensao, 2)));
                boolean jaFoiSorteado = false;
                do {
                    if (!numerosSorteados.contains(valorSorteado)) {
                        jaFoiSorteado = false;
                        numerosSorteados.add(valorSorteado);
                        estado[i][j] = valorSorteado;
                    } else {
                        jaFoiSorteado = true;
                        valorSorteado = (int) (Math.random() * (Math.pow(dimensao, 2)));
                    }
                } while (jaFoiSorteado);
            }
        }
    }

    /**
     * metodo que preenche a resposta certa do jogo
     * @return matriz contendo a resposta correta
     */
    private int[][] inicializaObjetivo() {
        int[][] obj = new int[dimensao][dimensao];
        int cont = 0;
        for (int i = 0; i < obj.length; i++) {
            for (int j = 0; j < obj.length; j++) {
                obj[i][j] = ++cont;
            }
        }
        obj[dimensao - 1][dimensao - 1] = 0;
        return obj;
    }

    /**
     * @return the objetivo
     */
    public int[][] getObjetivo() {
        return objetivo;
    }

    /**
     * @return the estado
     */
    public int[][] getEstado() {
        return estado;
    }

    /**
     * @param estado the estado to set
     */
    public void setEstado(int[][] estado) {
        this.estado = estado;
    }

    public boolean isObjetivo() {
        for (int i = 0; i < objetivo.length; i++) {
            for (int j = 0; j < objetivo.length; j++) {
                if (objetivo[i][j] != estado[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
}

